package cn.iocoder.yudao.module.product.service.storespu;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.product.controller.admin.storespu.vo.StoreSpuPageReqVO;
import cn.iocoder.yudao.module.product.controller.admin.storespu.vo.StoreSpuSaveReqVO;
import cn.iocoder.yudao.module.product.controller.admin.storespu.vo.StoreSpuUpdateStatusReqVO;
import cn.iocoder.yudao.module.product.dal.dataobject.storespu.StoreSpuDO;
import cn.iocoder.yudao.module.product.dal.mysql.storespu.StoreSpuMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.STORE_SPU_NOT_EXISTS;

/**
 * 店铺商品SPU Service 实现类
 *
 * @author 万民匠心
 */
@Service
@Validated
public class StoreSpuServiceImpl implements StoreSpuService {

    @Resource
    private StoreSpuMapper storeSpuMapper;

    @Override
    public Long createStoreSpu(StoreSpuSaveReqVO createReqVO) {
        // 插入
        StoreSpuDO storeSpu = BeanUtils.toBean(createReqVO, StoreSpuDO.class);
        storeSpuMapper.insert(storeSpu);
        // 返回
        return storeSpu.getId();
    }

    @Override
    public void updateStoreSpu(StoreSpuSaveReqVO updateReqVO) {
        // 校验存在
        validateStoreSpuExists(updateReqVO.getId());
        // 更新
        StoreSpuDO updateObj = BeanUtils.toBean(updateReqVO, StoreSpuDO.class);
        storeSpuMapper.updateById(updateObj);
    }

    @Override
    public void deleteStoreSpu(Long id) {
        // 校验存在
        validateStoreSpuExists(id);
        // 删除
        storeSpuMapper.deleteById(id);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateSpuStatus(StoreSpuUpdateStatusReqVO updateReqVO) {
        // 校验存在
        validateStoreSpuExists(updateReqVO.getId());

        // 更新状态
        StoreSpuDO storeSpuDO = storeSpuMapper.selectById(updateReqVO.getId()).setStatus(updateReqVO.getStatus());
        storeSpuMapper.updateById(storeSpuDO);
    }

    private void validateStoreSpuExists(Long id) {
        if (storeSpuMapper.selectById(id) == null) {
            throw exception(STORE_SPU_NOT_EXISTS);
        }
    }

    @Override
    public StoreSpuDO getStoreSpu(Long id) {
        return storeSpuMapper.selectById(id);
    }

    @Override
    public PageResult<StoreSpuDO> getStoreSpuPage(StoreSpuPageReqVO pageReqVO) {
        return storeSpuMapper.selectPage(pageReqVO);
    }

}